/*
 * .c
 *
 *  Created on: 2019年12月10日
 *      Author: tinnu
 */


#include "tarm_uart.h"

#include "fsl_usart.h"
#include "fsl_debug_console.h"


struct _StructUartBuf StructUart0RxBuf={0,0,""};
struct _StructUartBuf StructUart1RxBuf={0,0,""};

char UartRecFinishAsciiChar[2] = {0x0A, 0x0D};

void TransmitStr(USART_Type *base, char *str, int strSize)
{
	USART_WriteBlocking(base, (uint8_t*)str, strSize);
}

void PRINTF_UART0OnSize(const char *data, uint16_t length)
{
	USART_WriteBlocking(USART0, (uint8_t*)data, length);
}

void PRINTF_UART0(const char *data)
{
	USART_WriteBlocking(USART0, (uint8_t*)data, strlen(data));
}

void PRINTF_UART1OnSize(const char *data, uint16_t length)
{
	USART_WriteBlocking(USART2, (uint8_t*)data, length);
}

void PRINTF_UART1(const char *data)
{
	USART_WriteBlocking(USART2, (uint8_t*)data, strlen(data));
}

void USART_FL0_FLEXCOMM_IRQHANDLER()
{
	uint8_t data;

	/* If new data arrived. */
	if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(USART0))
	{
		data = USART_ReadByte(USART0);
		if(StructUart0RxBuf.FinishFlag!=2)
		{
			if(StructUart0RxBuf.FinishFlag==1)
			{
				if(data!=UartRecFinishAsciiChar[0])
					StructUart0RxBuf.FinishFlag=0;
				else {
					StructUart0RxBuf.FinishFlag=2;
//					USART_WriteBlocking(USART0, (const uint8_t *)StructUart0RxBuf.Rxbuf, (size_t)StructUart0RxBuf.RxbufSize);
//					PRINTF(StructUart0RxBuf.Rxbuf);
//					PRINTF("\r\n");
//					memset(StructUart0RxBuf.Rxbuf, 0, sizeof(StructUart0RxBuf.Rxbuf));
//					StructUart0RxBuf.FinishFlag = 0;
//					StructUart0RxBuf.RxbufSize = 0;
//					UartCallBackFunc(LPUART0);
				}
			}
			else \
			{
				if(data==UartRecFinishAsciiChar[1])
					StructUart0RxBuf.FinishFlag=1;
				else
				{
					StructUart0RxBuf.Rxbuf[StructUart0RxBuf.RxbufSize]=data ;
					StructUart0RxBuf.RxbufSize++;
					if(StructUart0RxBuf.RxbufSize>_UARTSAVEBUFSIZE){
						StructUart0RxBuf.FinishFlag = 0;
						StructUart0RxBuf.RxbufSize = 0;
					}
				}
			}
		}
	}
	/* Add for ARM errata 838869, affects Cortex-M4, Cortex-M4F Store immediate overlapping
	  exception return operation might vector to incorrect interrupt */
#if defined __CORTEX_M && (__CORTEX_M == 4U)
	__DSB();
#endif
}

void USART_FL2_FLEXCOMM_IRQHANDLER()
{
	uint8_t data;

	// If new data arrived.
	if ((kUSART_RxFifoNotEmptyFlag | kUSART_RxError) & USART_GetStatusFlags(USART2))
	{
		data = USART_ReadByte(USART2);
		if(StructUart1RxBuf.FinishFlag!=2)
		{
			if(StructUart1RxBuf.FinishFlag==1)
			{
				if(data!=UartRecFinishAsciiChar[0])
					StructUart1RxBuf.FinishFlag=0;
				else {
					StructUart1RxBuf.FinishFlag=2;
//					USART_WriteBlocking(USART2, (const uint8_t *)StructUart1RxBuf.Rxbuf, (size_t)StructUart1RxBuf.RxbufSize);
//					memset(StructUart1RxBuf.Rxbuf, 0, sizeof(StructUart1RxBuf.Rxbuf));
//					StructUart1RxBuf.FinishFlag = 0;
//					StructUart1RxBuf.RxbufSize = 0;
					//					UartCallBackFunc(LPUART1);
				}
			}
			else \
			{
				if(data==UartRecFinishAsciiChar[1])
					StructUart1RxBuf.FinishFlag=1;
				else
				{
					StructUart1RxBuf.Rxbuf[StructUart1RxBuf.RxbufSize]=data ;
					StructUart1RxBuf.RxbufSize++;
					if(StructUart1RxBuf.RxbufSize>_UARTSAVEBUFSIZE){
						StructUart1RxBuf.FinishFlag = 0;
						StructUart1RxBuf.RxbufSize = 0;
					}
				}
			}
		}
	}
}
